﻿using System.Collections.Generic;
using System.Diagnostics;

using RiskCalc.Modelo;
using System;

namespace RiskCalc.Teste
{
    public class ControladorTeste
    {
        private List<DateTime> vetTempos;

        /// <summary>
        /// Calculo dos retornos aritméticos
        /// </summary>
        public bool calcularVarParametrico(int confianca, int janelaDias, out List<Tempo> vetTempos, out string mensagemRetorno)
        {
            // Contador de tempo
            Stopwatch contadorEspecifico = new Stopwatch();
            Stopwatch contadorTotal = new Stopwatch();

            // Guarda os dados originais do banco e os calculados
            vetTempos = new List<Tempo>();

            Tempo tempoAux = null;

            contadorTotal.Start();
            contadorEspecifico.Start();

            // Carrega os dados na primeira chamada
            Carteira.getInstance().carregarDados(out mensagemRetorno);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Carregar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            Carteira.getInstance().calcularVarParametrico(confianca);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Cálculo do Var Paramétrico";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            //Carteira.getInstance().gravarDados(out mensagemRetorno);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Gravar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            return true;
        }

        /// <summary>
        /// Calculo de todos os VaR Históricos
        /// </summary>
        public bool calcularVaRHistoricos(int confianca, int janelaDias, out List<Tempo> vetTempos, out string mensagemRetorno)
        {
            // Contador de tempo
            Stopwatch contadorEspecifico = new Stopwatch();
            Stopwatch contadorTotal = new Stopwatch();

            // Guarda os dados originais do banco e os calculados
            vetTempos = new List<Tempo>();

            Tempo tempoAux = null;

            contadorTotal.Start();
            contadorEspecifico.Start();

            // Carrega os dados na primeira chamada
            CarteiraSimulacao.getInstance().carregarDados(out mensagemRetorno);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Carregar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            CarteiraSimulacao.getInstance().calcularVarParametrico(confianca);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Cálculo do Var Paramétrico";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            CarteiraSimulacao.getInstance().calcularVarHistorico();

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Gravar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            CarteiraSimulacao.getInstance().gravarDados(out mensagemRetorno);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Gravar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            return true;
        }

        /// <summary>
        /// Calculo dos retornos geométricos
        /// </summary>
        public bool calcularVarMonteCarlo(int confianca, int janelaDias, out List<Tempo> vetTempos, out string mensagemRetorno)
        {
            // Contador de tempo
            Stopwatch contadorEspecifico = new Stopwatch();
            Stopwatch contadorTotal = new Stopwatch();

            // Guarda os dados originais do banco e os calculados
            vetTempos = new List<Tempo>();

            Tempo tempoAux = null;

            contadorTotal.Start();
            contadorEspecifico.Start();

            // Carrega os dados na primeira chamada
            CarteiraSimulacao.getInstance().carregarDados(out mensagemRetorno);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Carregar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            CarteiraSimulacao.getInstance().calcularVarParametrico(confianca);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Cálculo do Var Paramétrico";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            CarteiraSimulacao.getInstance().calcularVarHistorico();

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Gravar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            CarteiraSimulacao.getInstance().calcularVarMonteCarlo();

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Gravar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            contadorEspecifico.Reset();

            contadorEspecifico.Start();

            CarteiraSimulacao.getInstance().gravarDados(out mensagemRetorno);

            contadorEspecifico.Stop();

            // Adiciona tempo registrado ao grid da interface
            tempoAux = new Tempo();
            tempoAux.Nome = "Gravar Dados";
            tempoAux.TempoNecessario = contadorEspecifico.Elapsed.ToString();
            vetTempos.Add(tempoAux);

            return true;
        }
    }
}
